package server

import (
	"chitchat_http/model"
	"encoding/json"
	"errors"
	"fmt"
	"math/rand"
	"strings"
	"time"
)

const Prefix = "chitchat_"
const UserSign = "user_token"
const AdminSign = "admin_token"

type UserToken struct {
	Token   string `json:"token" Testing:"token"`
	UserId  int64  `json:"user_id" Testing:"用户ID"`
	IsAdmin int    `json:"is_admin" Testing:"后台管理员:0=否,1=是"`
}

// TokenBySetToken 生成token
func (t *UserToken) TokenBySetToken() error {
	if t.Token == "" {
		return errors.New("token生成错误")
	}
	jsonData, err := json.Marshal(t)
	if err != nil {
		return err
	}
	key := fmt.Sprintf("%v_%v", t.UserId, UserSign)
	_, err = model.SelfRedis.Do("SETEX", Prefix+key, 3600*24*3, string(jsonData)).Result()
	if err != nil {
		return err
	}
	return nil
}

// TokenByGetToken 用户token获取对应数据
func TokenByGetToken(token *string) (*UserToken, error) {
	if *token == "" {
		return nil, errors.New("缺少token参数")
	}
	stringString := strings.Split(*token, "-")
	if len(stringString) < 2 {
		return nil, errors.New("token格式错误")
	}
	jsonToken := UserToken{}
	jsonData, err := model.SelfRedis.Do("GET", fmt.Sprintf("%v%v_%v", Prefix, stringString[0], UserSign)).Result()
	if err != nil || jsonData == nil {
		return nil, errors.New("在缓存中没有找到token")
	}
	err = json.Unmarshal([]byte(jsonData.(string)), &jsonToken)
	if err != nil {
		return nil, errors.New("token信息转json错误")
	}
	//验证获取的token是否正确
	if jsonToken.Token != *token {
		return nil, errors.New("token输入错误")
	}
	//重置token时间
	_, _ = model.SelfRedis.Do("EXPIRE", fmt.Sprintf("%v%v_token", Prefix, stringString[0]), 3600*24*3).Result()
	return &jsonToken, nil
}

// TokenSetCode 生成验证码的key，保存到redis里
func TokenSetCode(pre string, name string, t int) (int, error) {
	rand.Seed(time.Now().Unix())
	randCode := rand.Intn(899999) + 100000
	//存入redis
	_, err := model.SelfRedis.Do("SETEX", Prefix+pre+name, t, randCode).Result()
	if err != nil {
		return 0, err
	}
	return randCode, nil
}
// TokenGetCode 取出证码的key，并删除redis里的key
func TokenGetCode(pre string, name string, data string) error {
	jsonData, err := model.SelfRedis.Do("GET", Prefix+pre+name).Result()
	if err != nil || jsonData == nil {
		return errors.New("code不存在")
	}
	if data != jsonData.(string) {
		return errors.New("code错误，请重新输入")
	}
	//成功则删除数据
	_, err = model.SelfRedis.Do("DEL", Prefix+pre+name).Result()
	return nil

}

// +--------------------------------------------------------------------------
// + 总后台
// +--------------------------------------------------------------------------

type AdminToken struct {
	Token   string `json:"token" Testing:"token"`
	AdminId int64  `json:"user_id" Testing:"用户ID"`
}

// TokenBySetToken 生成token
func (t *AdminToken) TokenBySetToken() error {
	if t.Token == "" {
		return errors.New("token生成错误")
	}
	jsonData, err := json.Marshal(t)
	if err != nil {
		return err
	}
	key := fmt.Sprintf("%v_%v", t.AdminId, AdminSign)
	_, err = model.SelfRedis.Do("SETEX", Prefix+key, 3600*24*3, string(jsonData)).Result()
	if err != nil {
		return err
	}
	return nil
}

func AdminGetToken(token string) (*AdminToken, error) {
	if token == "" {
		return nil, errors.New("缺少token参数")
	}
	stringString := strings.Split(token, "-")
	if len(stringString) < 2 {
		return nil, errors.New("token格式错误")
	}
	jsonToken := AdminToken{}
	jsonData, err := model.SelfRedis.Do("GET", fmt.Sprintf("%v%v_%v", Prefix, stringString[0], AdminSign)).Result()
	if err != nil || jsonData == nil {
		return nil, errors.New("在缓存中没有找到token")
	}
	err = json.Unmarshal([]byte(jsonData.(string)), &jsonToken)
	if err != nil {
		return nil, errors.New("token信息转json错误")
	}
	//验证获取的token是否正确
	//if jsonToken.Token != token {
	//	return nil, errors.New("token输入错误")
	//}
	//重置token时间
	_, _ = model.SelfRedis.Do("EXPIRE", fmt.Sprintf("%v%v_token", Prefix, stringString[0]), 3600*24*3).Result()
	return &jsonToken, nil
}


